/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.cesupa.cabcc.sudi;
import br.cesupa.cabcc.util.Configuration;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * Classe modelo para realizar o crud da aplicação. Deve ser herdada pelas classes que queiram
 * realizar um crud.
 * @author yuri
 */
public class ObjectSUDI {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory(Configuration.PERSISTENCE_UNIT_NAME);

    /**
     * Método responsável por inserir um novo registro no banco de dados.
     * @param object Dado que será persistido no banco de dados.
     */
    protected void save(Object object) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

    /**
     * Método responsável por atualizar um determinado registro do banco de dados.
     * @param object Dado a ser atualizado no banco de dados.
     * @return Dado atualizado.
     */
    protected Object update(Object object) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            object = em.merge(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
        return object;
    }

    /**
     * Método responsável por excluir um determinado registro do banco de dados.
     * @param object Dado a ser removido do banco de dados.
     */
    protected void remove(Object object) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            object = em.merge(object);
            em.remove(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

    /**
     * Método responsável por pesquisar no banco de dados. Retorna apenas um registro.
     * @param namedQuery NamedQuery que será utilizada na pesquisa.
     * @return Resultado da pesquisa.
     */
    protected Object executeNamedQueryObject(String namedQuery) {
        EntityManager em = emf.createEntityManager();
        Object result = null;
        try {
            result = em.createNamedQuery(namedQuery).getSingleResult();
        } catch (Exception ex) {
            Logger.getLogger(ObjectSUDI.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } finally {
            em.close();
        }
        return result;
    }

    /**
     * Método responsável por pesquisar no banco de dados. Retorna apenas um registro.
     * @param namedQuery NamedQuery que será utilizada na pesquisa.
     * @param paramName Parâmetro da NamedQuery.
     * @param param Parâmetro da pesquisa.
     * @return Resultado da pesquisa.
     */
    protected Object executeNamedQueryObject(String namedQuery, String paramName, Object param) {
        EntityManager em = emf.createEntityManager();
        Object result = null;
        try {
            result = em.createNamedQuery(namedQuery).setParameter(paramName, param).getSingleResult();
        } catch (Exception ex) {
            Logger.getLogger(ObjectSUDI.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } finally {
            em.close();
        }
        return result;
    }

    /**
     * Método responsável por pesquisar no banco de dados. Retorna apenas um registro.
     * @param namedQuery NamedQuery que será utilizada na pesquisa.
     * @param paramName1 Primeiro parâmetro da NamedQuery.
     * @param param1 Primeiro parâmetro da pesquisa.
     * @param paramName2 Segundo parâmetro da NamedQuery.
     * @param param2 Segundo parâmetro da pesquisa.
     * @return Resultado da pesquisa.
     */
    protected Object executeNamedQueryObject(String namedQuery, String paramName1, Object param1, String paramName2, Object param2) {
        EntityManager em = emf.createEntityManager();
        Object result = null;
        try {
            result = em.createNamedQuery(namedQuery).setParameter(paramName1, param1).setParameter(paramName2, param2).getSingleResult();
        } catch (Exception ex) {
            Logger.getLogger(ObjectSUDI.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } finally {
            em.close();
        }
        return result;
    }

    /**
     * Método responsável por pesquisar no banco de dados. Retorna uma lista de registros.
     * @param namedQuery NamedQuery que será utilizada na pesquisa.
     * @return Resultado da pesquisa.
     */
    protected List executeNamedQueryList(String namedQuery) {
        EntityManager em = emf.createEntityManager();
        List result = null;
        try {
            result = em.createNamedQuery(namedQuery).getResultList();
        } catch (Exception ex) {
            Logger.getLogger(ObjectSUDI.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } finally {
            em.close();
        }
        return result;
    }

    /**
     * Método responsável por pesquisar no banco de dados. Retorna uma lista de registros.
     * @param namedQuery NamedQuery que será utilizada na pesquisa.
     * @param paramName Parâmetro da NamedQuery.
     * @param param Parâmetro da pesquisa.
     * @return Resultado da pesquisa.
     */
    protected List executeNamedQueryList(String namedQuery, String paramName, Object param) {
        EntityManager em = emf.createEntityManager();
        List result = null;
        try {
            result = em.createNamedQuery(namedQuery).setParameter(paramName, param).getResultList();
        } catch (Exception ex) {
            Logger.getLogger(ObjectSUDI.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } finally {
            em.close();
        }
        return result;
    }

    /**
     * Método responsável por pesquisar no banco de dados. Retorna uma lista de registros.
     * @param namedQuery NamedQuery que será utilizada na pesquisa.
     * @param paramName1 Primeiro parâmetro da NamedQuery.
     * @param param1 Primeiro parâmetro da pesquisa.
     * @param paramName2 Segundo parâmetro da NamedQuery.
     * @param param2 Segundo parâmetro da pesquisa.
     * @return Resultado da pesquisa.
     */
    protected List executeNamedQueryList(String namedQuery, String paramName1, Object param1, String paramName2, Object param2) {
        EntityManager em = emf.createEntityManager();
        List result = null;
        try {
            result = em.createNamedQuery(namedQuery).setParameter(paramName1, param1).setParameter(paramName2, param2).getResultList();
        } catch (Exception ex) {
            Logger.getLogger(ObjectSUDI.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        } finally {
            em.close();
        }
        return result;
    }
}